﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace CPPEI.Coolzon.UI
{
    /// <summary>
    /// 数据项组件
    /// </summary>
    public abstract class DataItemPart : DataPart
    {
        #region fields
        private ServiceProxy.DataServiceRef.DataItem _dataItem;
        #endregion

        public ServiceProxy.DataServiceRef.DataItem DataItem
        {
            get
            {
                return _dataItem;
            }
        }

        #region xProperties

        private string _XDataSeriesId;
        [Category("Data")]
        [DisplayName("数据串编号")]
        [Description("DataSeriesId")]
        [Editor(typeof(XProperty.Editors.XStringEditor), typeof(XProperty.XPropertyValueEditor))]
        [XProperty(XPropertyCategory.Data, "DataSeriesId", "数据串编号")]
        public string XDataSeriesId
        {
            get { return _XDataSeriesId; }
            set
            {
                _XDataSeriesId = value;
                Refresh();
            }
        }

        private string _XDataItemId;
        [Category("Data")]
        [DisplayName("数据项编号")]
        [Description("DataItemId")]
        [Editor(typeof(XProperty.Editors.XStringEditor), typeof(XProperty.XPropertyValueEditor))]
        [XProperty(XPropertyCategory.Data, "DataItemId", "数据项编号")]
        public string XDataItemId
        {
            get { return _XDataItemId; }
            set
            {
                _XDataItemId = value;
                Refresh();
            }
        }

        #endregion

        #region XEvents
        /// <summary>
        /// DataItemBind脚本事件
        /// </summary>
        public static XEvent XEventOnDataItemBind = XEventManager.Register(typeof(DataItemPart),
            "OnDataItemBind",
            new XEventArgument("sender", typeof(Script.PartScriptObject)),
            new XEventArgument("data", typeof(Script.DataItemScriptObject)));
        #endregion

        public DataItemPart()
        {
        }

        //protected override void OnInitScriptEngine(ScriptEngine engine)
        //{
        //    if (_dataItem != null)
        //    {
        //        Common.Logger.DebugToTag("UI", "Part:{0} add dataItem name:{1} value:{2} id:{3} to engine", this.Name,
        //            _dataItem.Name,
        //            _dataItem.Value,
        //            _dataItem.Id);
        //        ScriptEngine.AppendDataItem(engine, _dataItem);
        //    }
        //    else
        //    {
        //        Common.Logger.WarningToTag("UI", "Part:{0} exec OnInitScriptEngine.AppendDataItem but dataitem is null", this.Name);
        //    }
        //    base.OnInitScriptEngine(engine);
        //}

        protected override void OnDataBinding(ServiceProxy.DataServiceRef.DataResult dataResult)
        {
            if (dataResult != null)
            {
                bool isExistDataItem = false;
                for (int index = 0; index < dataResult.DataSeries.Length; index++)
                {
                    ServiceProxy.DataServiceRef.DataSeries series = dataResult.DataSeries[index];
                    if (!string.IsNullOrEmpty(XDataSeriesId) && series.Id.ToUpper().Equals(XDataSeriesId.ToUpper()))
                    {
                        for (int itemIndex = 0; itemIndex < series.DataItems.Length; itemIndex++)
                        {
                            ServiceProxy.DataServiceRef.DataItem item = series.DataItems[itemIndex];
                            if (!string.IsNullOrEmpty(XDataItemId) && item.Id.ToUpper().Equals(XDataItemId.ToUpper()))
                            {
                                _dataItem = item;
                                try
                                {
                                    OnDataItemBinding(item);
                                }
                                catch (Exception ex)
                                {
                                    Common.Logger.ErrorToTag("UI", "{0}在数据绑定时的出错:{1}",
                                        this.Name,
                                        ex);
                                }
                                isExistDataItem = true;
                            }
                        }
                    }
                }

                if (!isExistDataItem)
                {
                    Common.Logger.WarningToTag("UI", "{0}:{1}在数据绑定时，没有发现 串：{2}，项：{3}的数据",
                        this.GetType().Name,
                        this.Name,
                        this.XDataSeriesId,
                        this.XDataItemId);
                }
            }

            if (HasScriptEvent(XEventOnDataItemBind.Name))
            {
                if (_dataItem != null)
                {
                    this.InvokeScriptEvent(this.PartContext.ScriptEngine, XEventOnDataItemBind.Name, this.GetScriptObj(), new Script.DataItemScriptObject(_dataItem));
                }
                else
                {
                    Common.Logger.ErrorToTag("UI", "组件{0}具有OnDataItemBind脚本不执行InvokeScriptEvent，因为没有发现数据项",
                        this.Name);
                }
            }
        }

        protected abstract void OnDataItemBinding(ServiceProxy.DataServiceRef.DataItem dataItem);
    }
}
